
package rendi456.structure.stack;

/**
 * Implémente une pile d'objet.
 * 
 * @author David Bernard
 * 
 * @param <T> La classe de l'élément.
 */
public class Pile<T>
{
	private NoeudPile<T> sommet = null;

	/**
	 * Instancie une pile vide.
	 */
	public Pile()
	{
		super();
	}

	/**
	 * Instancie une pile avec un élément.
	 * 
	 * @param element
	 */
	public Pile(T element)
	{
		this();
		this.empiler(element);
	}

	/**
	 * Permet de savoir si une pile est v
	 * 
	 * @return
	 */
	public boolean estVide()
	{
		return this.sommet == null;
	}

	public void vider()
	{
		this.sommet = null;
	}

	public void empiler(T element)
	{
		this.sommet = new NoeudPile<T>(element, this.sommet);
	}

	public T depiler()
	{
		T out = null;

		if (this.estVide())
		{
			throw new PileException();
		}
		else
		{
			out = this.getPremier();
			this.sommet = this.sommet.getPrecedent();
		}

		return out;
	}

	public T getPremier()
	{
		T out = null;
		if (this.estVide())
		{
			throw new PileException();
		}
		else
		{
			out = this.sommet.getElement();
		}

		return out;
	}

	@Override
	public String toString()
	{
		NoeudPile<T> temp = null;
		T buffer = null;
		String msg = null;

		temp = this.sommet;
		msg = "#Début#";

		while (temp != null)
		{
			buffer = temp.getElement();

			if (buffer == null)
			{
				msg += "null";
			}
			else
			{
				msg += buffer.toString();
			}

			msg += ", ";

			temp = temp.getPrecedent();
		}

		msg += "#fin#";

		return msg;
	}

	public static void main(String[] args)
	{
		String buffer = null;
		Pile<String> p = null;
		String[] vect =
		{ "zero", "un", "deux", "trois", "quatre", "cinq" };

		p = new Pile<String>();

		System.out.println("debut");

		for (int i = 0; i < vect.length; i++)
		{
			p.empiler(vect[i]);
		}

		System.out.println(p.toString());

		while (!p.estVide())
		{
			buffer = p.depiler();

			System.out.println(buffer);
		}

		System.out.println("fin");
	}
}
